from sanic import Sanic, response
# 通常我们的Web应用返回的都是HttpResponse对象，
# 包括纯文本(text),HTML文本，JSON,文件(File)
# 重定向和生数据(Raw),他们的不同体现在响应头中
# 的Content-Type设置
from sanic.server import HttpProtocol
from uvloop.loop import TCPTransport

app = Sanic()


@app.route('/text')
async def get_text(request):
    return response.text('Hello world!')


@app.route('/html')
async def get_html(request):
    return response.html('<h1>Hello world!</h1>')


@app.route('/json')
async def get_json(request):
    return response.json({'result': 'Hello world!'})


# 在响应头中添加Transfer-Encoding: chunked(分块传输编码)
@app.route('/streaming')
async def get_stream(request):
    async def streaming_fn(response):  # response为StreamingHttpResponse对象
        await response.write('hello')
        await response.write(' world')

    return response.stream(streaming_fn, content_type='text/plain')


# 文件流
@app.route('/file_stream')
async def file_stream(request):
    return await response.file_stream('./test.jpg')


# 重定向
@app.route('/redirect')
async def handle_redirect(request):
    return response.redirect('/file_stream')


# 访问/raw,浏览器会自动下载文件
# 响应头中： Content-Type: application/octet-stream
@app.route('/raw')
async def handle_raw(request):
    return response.raw(b'raw data')


# HTTP状态码为204 Not Content
# 表示执行成功，没有数据
@app.route('/empty')
async def handle_empty(request):
    return response.empty()


# 更改响应头和状态码
@app.route('/headers')
async def handle_headers(request):
    return response.json(
        {'result': 'Hello world'},
        # 添加额外的响应头
        headers={'X-Powered-By': 'sanic'},
        # 更改状态码
        status=404
    )


if __name__ == '__main__':
    app.run(debug=True)
